#include <nng/nng.h>
#include <nng/protocol/pubsub0/sub.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
 
int main() {
    nng_socket sub_sock;
    int rv;
 
    // 创建订阅者套接字
    if ((rv = nng_sub0_open(&sub_sock)) != 0) {
        fprintf(stderr, "无法创建订阅者套接字: %s\n", nng_strerror(rv));
        return 1;
    }
 
    // 订阅所有主题
    if ((rv = nng_setopt(sub_sock, NNG_OPT_SUB_SUBSCRIBE, "", 0)) != 0) {
        fprintf(stderr, "设置订阅选项失败: %s\n", nng_strerror(rv));
        nng_close(sub_sock);
        return 1;
    }
 
    // 连接到发布者
    //if ((rv = nng_dial(sub_sock, "tcp://127.0.0.1:5555", NULL, 0)) != 0) {
    if ((rv = nng_dial(sub_sock, "tcp://192.168.88.133:9556", NULL, 0)) != 0) {
        fprintf(stderr, "无法连接到发布者: %s\n", nng_strerror(rv));
        nng_close(sub_sock);
        return 1;
    }
 
    // 接收消息
    char *buf = NULL;
    size_t buf_size = 0;
    for (int i = 0; i < 10; ++i) {
        if ((rv = nng_recv(sub_sock, &buf, &buf_size, NNG_FLAG_ALLOC)) != 0) {
            fprintf(stderr, "接收消息失败: %s\n", nng_strerror(rv));
            break;
        }
        printf("收到消息: %.*s\n", (int)buf_size, buf);
        nng_free(buf, buf_size); // 释放缓冲区
    }
 
    // 关闭套接字
    nng_close(sub_sock);
    return 0;
}